{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# RNN 用于时间序列的分析\n",
    "前面我们讲到使用 RNN 做简单的图像分类的问题，但是 RNN 并不擅长此类问题，下面我们讲一讲如何将 RNN 用到时间序列的问题上，因为对于时序数据，后面的数据会用到前面的数据，LSTM 的记忆特性非常适合这种场景。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "首先我们可以读入数据，这个数据是 10 年飞机月流量，可视化得到下面的效果。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "data_csv = pd.read_csv('./data.csv', usecols=[1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x1fa97f84040>]"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(data_csv)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "首先我们进行预处理，将数据中 `na` 的数据去掉，然后将数据标准化到 0 ~ 1 之间。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 数据预处理\n",
    "data_csv = data_csv.dropna()\n",
    "dataset = data_csv.values\n",
    "dataset = dataset.astype('float32')\n",
    "max_value = np.max(dataset)\n",
    "min_value = np.min(dataset)\n",
    "scalar = max_value - min_value\n",
    "dataset = list(map(lambda x: x / scalar, dataset))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接着我们进行数据集的创建，我们想通过前面几个月的流量来预测当月的流量，比如我们希望通过前两个月的流量来预测当月的流量，我们可以将前两个月的流量当做输入，当月的流量当做输出。同时我们需要将我们的数据集分为训练集和测试集，通过测试集的效果来测试模型的性能，这里我们简单的将前面几年的数据作为训练集，后面两年的数据作为测试集。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def create_dataset(dataset, look_back=2):\n",
    "    dataX, dataY = [], []\n",
    "    for i in range(len(dataset) - look_back):\n",
    "        a = dataset[i:(i + look_back)]\n",
    "        dataX.append(a)\n",
    "        dataY.append(dataset[i + look_back])\n",
    "    return np.array(dataX), np.array(dataY)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 创建好输入输出\n",
    "data_X, data_Y = create_dataset(dataset)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 划分训练集和测试集，70% 作为训练集\n",
    "train_size = int(len(data_X) * 0.7)\n",
    "test_size = len(data_X) - train_size\n",
    "train_X = data_X[:train_size]\n",
    "train_Y = data_Y[:train_size]\n",
    "test_X = data_X[train_size:]\n",
    "test_Y = data_Y[train_size:]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "最后，我们需要将数据改变一下形状，因为 RNN 读入的数据维度是 (seq, batch, feature)，所以要重新改变一下数据的维度，这里只有一个序列，所以 batch 是 1，而输入的 feature 就是我们希望依据的几个月份，这里我们定的是两个月份，所以 feature 就是 2."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import torch\n",
    "\n",
    "train_X = train_X.reshape(-1, 1, 2)\n",
    "train_Y = train_Y.reshape(-1, 1, 1)\n",
    "test_X = test_X.reshape(-1, 1, 2)\n",
    "\n",
    "train_x = torch.from_numpy(train_X)\n",
    "train_y = torch.from_numpy(train_Y)\n",
    "test_x = torch.from_numpy(test_X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(99, 1, 2)"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_X.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(43, 1, 2)"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_X.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from torch import nn\n",
    "from torch.autograd import Variable"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这里定义好模型，模型的第一部分是一个两层的 RNN，每一步模型接受两个月的输入作为特征，得到一个输出特征。接着通过一个线性层将 RNN 的输出回归到流量的具体数值，这里我们需要用 `view` 来重新排列，因为 `nn.Linear` 不接受三维的输入，所以我们先将前两维合并在一起，然后经过线性层之后再将其分开，最后输出结果。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 定义模型\n",
    "class lstm_reg(nn.Module):\n",
    "    def __init__(self, input_size, hidden_size, output_size=1, num_layers=2):\n",
    "        super(lstm_reg, self).__init__()\n",
    "        \n",
    "        self.rnn = nn.LSTM(input_size, hidden_size, num_layers) # rnn\n",
    "        self.reg = nn.Linear(hidden_size, output_size) # 回归\n",
    "        \n",
    "    def forward(self, x):\n",
    "        x, _ = self.rnn(x) # (seq, batch, hidden)\n",
    "        s, b, h = x.shape\n",
    "        x = x.view(s*b, h) # 转换成线性层的输入格式\n",
    "        x = self.reg(x)\n",
    "        x = x.view(s, b, -1)\n",
    "        return x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "net = lstm_reg(2, 4)\n",
    "\n",
    "criterion = nn.MSELoss()\n",
    "optimizer = torch.optim.Adam(net.parameters(), lr=1e-2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "定义好网络结构，输入的维度是 2，因为我们使用两个月的流量作为输入，隐藏层的维度可以任意指定，这里我们选的 4"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch: 100, Loss: 0.00395\n",
      "Epoch: 200, Loss: 0.00337\n",
      "Epoch: 300, Loss: 0.00259\n",
      "Epoch: 400, Loss: 0.00149\n",
      "Epoch: 500, Loss: 0.00109\n",
      "Epoch: 600, Loss: 0.00106\n",
      "Epoch: 700, Loss: 0.00097\n",
      "Epoch: 800, Loss: 0.00092\n",
      "Epoch: 900, Loss: 0.00087\n",
      "Epoch: 1000, Loss: 0.00105\n"
     ]
    }
   ],
   "source": [
    "# 开始训练\n",
    "for e in range(1000):\n",
    "    var_x = Variable(train_x)\n",
    "    var_y = Variable(train_y)\n",
    "    # 前向传播\n",
    "    out = net(var_x)\n",
    "    loss = criterion(out, var_y)\n",
    "    # 反向传播\n",
    "    optimizer.zero_grad()\n",
    "    loss.backward()\n",
    "    optimizer.step()\n",
    "    if (e + 1) % 100 == 0: # 每 100 次输出结果\n",
    "        print('Epoch: {}, Loss: {:.5f}'.format(e + 1, loss.data[0]))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "训练完成之后，我们可以用训练好的模型去预测后面的结果"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "net = net.eval() # 转换成测试模式"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [],
   "source": [
    "data_X = data_X.reshape(-1, 1, 2)\n",
    "data_X = torch.from_numpy(data_X)\n",
    "var_data = Variable(data_X)\n",
    "pred_test = net(var_data) # 测试集的预测结果"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 改变输出的格式\n",
    "pred_test = pred_test.view(-1).data.numpy()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x120f7f358>"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAD8CAYAAACMwORRAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAIABJREFUeJzsnXl4VOX1xz9vEiBAAgkQAlkgYY/ssguCK0XU4q64YlWsitaqbe2vrbVqW637glrccK9bXUu1orgAgoKy7yGEhAAhYSeEbO/vjzN3lmQmmUkmZOF8nifPZO69c+87Qb/33O973nOMtRZFURSleRHR0ANQFEVRwo+Ku6IoSjNExV1RFKUZouKuKIrSDFFxVxRFaYaouCuKojRDVNwVRVGaISruiqIozRAVd0VRlGZIVENduFOnTjYtLa2hLq8oitIkWbp0aYG1NqGm4xpM3NPS0liyZElDXV5RFKVJYozJDuY4tWUURVGaISruiqIozRAVd0VRlGZIg3nu/igtLSU3N5fi4uKGHkqzIjo6mpSUFFq0aNHQQ1EU5SjRqMQ9NzeX2NhY0tLSMMY09HCaBdZaCgsLyc3NJT09vaGHoyjKUaJGW8YY86IxJt8YsyrA/suMMStcPwuNMYNrO5ji4mI6duyowh5GjDF07NhRn4YU5RgjGM99NjCpmv1ZwARr7SDgXmBWXQakwh5+9G+qKMceNYq7tfYbYHc1+xdaa/e43i4CUsI0NkVRlCbBunXw6acNPQpfwp0tcw3w30A7jTHTjTFLjDFLdu3aFeZLN05iYmIAyMvL44ILLqj22Mcee4yioiL3+8mTJ7N37956HZ+iKHXngQfgnHNg376GHomHsIm7MeZkRNx/F+gYa+0sa+1wa+3whIQaV882WsrLy0P+TFJSEu+++261x1QW9zlz5hAXFxfytRRFOboUFsKRI/DBBw09Eg9hEXdjzCDgeWCKtbYwHOdsKLZs2UK/fv246qqrGDRoEBdccAFFRUWkpaVxzz33MG7cON555x0yMzOZNGkSw4YN48QTT2TdunUAZGVlMWbMGEaMGMGf/vQnn/MOGDAAkJvDHXfcwcCBAxk0aBBPPvkkTzzxBHl5eZx88smcfPLJgJRoKCgoAOCRRx5hwIABDBgwgMcee8x9zoyMDK677jr69+/PxIkTOXz48NH8cymKAuxxGdNvvtmw4/CmzqmQxphuwL+BK6y1G+o+JBe33grLloXtdAAMGQIuYayO9evX88ILLzB27Fh+8Ytf8PTTTwOSLz5//nwATj31VJ599ll69+7N4sWLufHGG/nyyy/51a9+xQ033MCVV17JzJkz/Z5/1qxZZGVl8dNPPxEVFcXu3bvp0KEDjzzyCPPmzaNTp04+xy9dupSXXnqJxYsXY61l1KhRTJgwgfj4eDZu3Mibb77Jc889x0UXXcR7773H5ZdfXsc/lKIooeC4p3PnQn4+dO7csOOB4FIh3wS+A/oaY3KNMdcYY35pjPml65C7gI7A08aYZcaYJl8NLDU1lbFjxwJw+eWXuwX94osvBuDgwYMsXLiQCy+8kCFDhnD99dezfft2ABYsWMDUqVMBuOKKK/yef+7cufzyl78kKkrurR06dKh2PPPnz+fcc8+lbdu2xMTEcN555/Htt98CkJ6ezpAhQwAYNmwYW7ZsqcM3VxSlNuzdCyNGQHk5vPNOQ49GqDFyt9ZOrWH/tcC1YRuRQxARdn1ROXXQed+2bVsAKioqiIuLY1mAJ4uaUg+ttSGlJ1prA+5r1aqV+/fIyEi1ZRSlAdizBy68EIqKxJq56aaGHpHWlvHL1q1b+e677wB48803GTdunM/+du3akZ6ezjuuW7S1luXLlwMwduxY/vWvfwHw+uuv+z3/xIkTefbZZykrKwNg927JNI2NjeXAgQNVjh8/fjwffPABRUVFHDp0iPfff58TTzwxDN9UUZS6UloKhw5BfLxkzCxYIJOrDY2Kux8yMjJ4+eWXGTRoELt37+aGG26ocszrr7/OCy+8wODBg+nfvz8ffvghAI8//jgzZ85kxIgR7AuQF3XttdfSrVs3Bg0axODBg3njjTcAmD59OmeccYZ7QtXh+OOPZ9q0aYwcOZJRo0Zx7bXXMnTo0DB/a0VRaoPjt8fFQZcu8vv+/Q03HgdT3SN/fTJ8+HBbuVnH2rVrycjIaJDxOGzZsoWzzjqLVav8VltosjSGv62iNEc2boQ+feCVV8BauOoq2darV/1czxiz1Fo7vKbjGlXhMEVRlKaGE7nHx8uEKjSOyF3FvRJpaWnNLmpXFKX+cHLc4+LANY3WKFaqqrgriqLUAe/I3ZlIVXFXFEVp4nhH7k5lbbVlFEVRmjjekfuhQ/K7Ru6KoihNnD17oEULaN0aIiNlW2OI3DXPPcxMmzatxuqPiqI0H/buFUvGGGjVSn4aQ+Su4l4N1loqKioaehiKojRi9u4VS8ahfXuN3BslThndG2+8keOPP55XX32VMWPGcPzxx3PhhRdy8OBBAO655x5GjBjBgAEDmD59erX1XxRFab7s2SORu0P79o0jcm+0nnsDVvxl/fr1vPTSS9xzzz2cd955zJ07l7Zt2/LAAw/wyCOPcNdddzFjxgzuuusuQKo/fvLJJ5x99tnhHbCiKI2eypF7u3Yq7o2W7t27M3r0aD755BPWrFnjLv9bUlLCmDFjAJg3bx7/+Mc/KCoqYvfu3fTv31/FXVGOQfbsgfR0z/vGYss0WnFvwIq/7tK+1lpOP/103qzUXqW4uJgbb7yRJUuWkJqayt13302xk+CqKMoxhb/IfdOmhhuPg3ru1TB69GgWLFjAJte/VFFRERs2bHALeadOnTh48KBmxyjKMYq1/j13jdwbOQkJCcyePZupU6dyxLWu+L777qNPnz5cd911DBw4kLS0NEaMGNHAI1UUpSEoKpJ6MpWzZdRzb4RULhx2yimn8MMPP1Q57r777uO+++6rsn327Nn1OTxFUWrJRx/B6NHh7W/qXcvdoV07idwrKiCiAb0RtWUURWn2LFwIU6bAc8+F97zedWUc2rcXu8YpRdBQqLgritLs+fOf5dXV0TJseNeVcWjXTl4b2pppdOKui4HCj/5NlWOZb76BuXPl93BPdAaK3OvjWqHSqMQ9OjqawsJCFaMwYq2lsLCQ6Ojohh6KojQIf/6z9DZNSwt/NN2YI/dGNaGakpJCbm4uu3btauihNCuio6NJSUlp6GEoylEnMxO++goefBDefbf+xL0xRu6NStxbtGhBuvdSL0VRlDqwY4e8DhwIn38efnGvzpZp6Mi9UdkyiqIo4aSwUF47dqyf/PO9eyEmBqK8wuTGYsuouCuK0mypb3GvvDoVGo8to+KuKEqzxUl97Nixfqo1Vq4rAxLJG6ORu6IoSr1RWCiWSWysRNROuYBwsXt3VXGPiJDraeSuKIpSTxQWQocOEknXh12Sn++/nEFjqOmu4q4oSrOlsFAsGaifLJadO/2Le2MoHlajuBtjXjTG5BtjVgXYb4wxTxhjNhljVhhjjg//MBVFUUKnPsW9pEQmVBMTq+5rDGV/g4ncZwOTqtl/BtDb9TMdeKbuw1IURak7u3fXn7g7ay39iXuTsGWstd8A1ZXbmQK8YoVFQJwxpmu4BqgoilJbHM8dwi/uO3fKayBbpilE7jWRDOR4vc91bVMURWlQ6tOWyc+X1yYbuQeB8bPNb+UvY8x0Y8wSY8wSrR+jKEp9UlQExcUecXdWjoYronYi96bsuddELpDq9T4FyPN3oLV2lrV2uLV2eEJCQhgurSiK4h/v1alwdG2Zdu3g8GEoLQ3PtWpDOMT9I+BKV9bMaGCftXZ7GM6rKIpSa5zVqY7n3qqV/ITTlmndWlakVqYxFA+rsSqkMeZN4CSgkzEmF/gz0ALAWvssMAeYDGwCioCr62uwiqIowVI5cofw5p/v3CmWjPFjTDvivncvdOoUnuuFSo3ibq2dWsN+C9wUthEpinJM8eabUo73xRfDe96jIe6Bmm13deUL5uVBr17huV6o6ApVRVEajIoK+OMf4Y03wn/u+hb3/Hz/k6kA3bvL69at4blWbVBxVxSlwfjyS9i8GY4ckZ9w4oi747lD/dgy/kh1pZiouCuKckwya5bn9wMHwnvu3buhTRvwbh8crhTFigpZoRrIlmnTRrz27Oy6X6u2qLgritIg7NwJ77/v8afDnRfuvYDJIVyLi3bvhvLywJE7iDWjkbuiKMccL78stdVvvlneHw1xD5ctU90CJodu3TRyVxTlGOSLL2DwYBg1St6HOyc8kLgfOCC2Sl1wSg8EsmVAxH3rVrB+1+vXPyruiqI0CHl5kJ4e/rIAAGRlUfjTVjq0KfbZ3L69iG1d/f1gIvfu3eHQISkL3BCouCuK0iBs3y5+e72I+6efsru4NR1LfCuhhGvlaLC2DDScNaPirijKUefIEbFNkpLqp/1dxU/L2U0HOpbt9NkeLnHPz4fIyKr9U71p6Fx3FXdFUY46O3bIa31F7vt+zKSCSDoW5fpsD9eNxFmdGvHZf2HOHL/HNHTkXmP5AUVRlHCT53JLkpIkDz0qKoziXl5O4Wq5e3Tct9lnVzhtmcRE4NZbITYWJk+uckxCgnw3jdwVRTk2OHSI7dklgETuxkj0HjZxz8yksLgNAB0KN/rscp4SwmHLdI4rgQ0bPI8hlTDGkzHTEKi4K4py9LAWxo4l7/5XAIncIcydi5YtowApxdgpf410snYRjsj9wAFYvx5SIl2VzXfuDJhb2ZC57iruiqL45dAhmDtXuhmFjW+/heXL2b48n6go6y6HG9bIffly8iKkuEuSzfVR13CI+5NPyuev7/KhbCgrC5jvqJG7oiiNhoMHYdo08ZRPP11K8oaNf/4T2rYlj650aXOACJcChVvcczsNwRhLV7bDpk3uXa1bi79fW3Hfvx8eegjOOgtGbv6XZ0cAa6Z7d9kV1htkkKi4K4riw7ffSmmAn/9c3ufkhOnEhYXw7rtw9dVs79CfrsVZbjsj3OK+LbYfiQkVtKAMMjPdu4ypWwmCxx+XIP0vvy+GJUs8y2sDiLuTMZOb63d3vaLiriiKD5tdCSYPPSTL93furP74oHnlFfG/p08nr21vkkqy4KuvgDA2lC4shNxcciO7k9ItQsozeok7SBbLrl2hn7q8HB59FKZMgePLf5AGqeefLztrEPeGsGZU3BVF8SErS1L4unSRXO6wifvzz8Po0TBwINsPx9G15W7ZRhgj9+XLAdhWkkBysoGePX1sGZAMnbw8fx+unrw8idonTwYWLJCN550nrwHE3VnBWpubSV1RcVcUxYesLEhLg4gIESenSFadOHwY1qyBM86gpAQKCgxJPaLdYhw2cf/mGzCG3D1tSElBxL1S5J6UJKUPQsV5ounRA5g/H/r1kzfR0QHvgAkJ8lpQEPr16oqKu6IoPmzeLAW9IIyRu+NLpKd7VqfGF8vsLSLuhw+L01FrrIXXXuPQ+DPYuy+C5GSkgenmzT6pik7kHmq1Rh9xX7YMRowQE79Ll4CRu9MFSiN3RVEanKwsl4AhkXtYxN1JR+ze3bM6tYOvuEMdo/dFiyAzk22TrgHwRO5HjsC2be7DunaV7JVQJ1U3b5Z6MqlJ5SLmTi+9xMSA4h4VJfVnNHJXFKVB2bNHRM+J3BMT5X2d+5t6ibtjiXRNKAuvuL/6KrRuzbaBkwAkcu/ZU/Z5WTPOwqlQfffNm2WCtMW+AplddU5UTeQO0m5PxV1RlAYlK0tevW0ZCIPvvmWLhL3JyZ7IPbFcsmdKSuou7iUl8NZbcM45bNsjpQdSUvCUZvTK53Ta+oXqu2/e7Hqicb6AcyIVd0VRGjuVxd3J9qizNZOdLaF0VBTbt4vOJ3Q2su/QobqL+5w50tj0iivcOeXJyXgeCby6c9Qlck9Px3NX8Bb3ggJZqeoHFXdFURocn0lDPOJe58g9O9sdRefliR5GtIuRfQcP1r0U77x50LYtnH4627ZBXJy8JTZW9nuJe20i94MH5W/Qo4fXB527RGKizM4GmDVVcVcUpWE4eBC+/BKys8nabImP99RgcWyZsETuLnF3OjAR4xL3AwfqXq0xN1cM8agocnNdUTvIIqaICLe3j+uysbGhRe7OE42PLdOli+9rAGvGEfej3UtVxV1RjnUefxxOPRXS0sh6cR7pqR57ISy2TGmpZKukpQF+xP3gwdBtmW++keX/Dtu2uRV92zaX3w6SqhgTU6VpateuoUXuPk8027fL0t1WrWRjDeKekCAT0ocOyfvDh4O/bl1QcVeUY50NGyRE/9OfyCpJIj3GYy+0aSPaWCdx37ZN8sxdkfuuXa4nAscyqY24/+pX8Nvfet7n5bnF3SdyB7/inpQUWuReRdwdbweCitzBE70nJsLvfhf8tWuLiruiHOtkZ0OfPlTc8VuySKcHvt2LOneuo+fulQZprZR/6dQJn8jdcU+CFveCAsnAAblxbN8OycmUlorGuiN3kJtIGCL3du1ci5Ly8nzFvYbHG29xLyyUoXh/vL5QcVeUY50tWyT//EAMJbQi/cAKn911XsjkiHD37hw6JBZFZXEPuRvT7t2S3lheLneesjJITmbHDomOfSJ3P+LuRO7B+uBOGqQxyF3BmUwFebyJjQ0qcq88YV2fqLgryrFMWZn4GN27e9Igc7/1OaTO4u5E7t26ubNGOnbER9whBHEvLoaiIhl7Xp5n9WlysvvXYCL3w4eDn8B157g7TwmVQ+9qct0btbgbYyYZY9YbYzYZY+70s7+bMWaeMeYnY8wKY0zVbrGKojQ+8vIk+k1Lc2tw2p4ffTyLsNgyiYkQHe0Wd5/I3SW8QZf99e56tGWLR9yTkrx13kNsrE+2jOtQIDhrpqLCqyRDYaHcVLwjdwhZ3J11BPVJjeJujIkEZgJnAMcBU40xx1U67I/A29baocAlwNPhHqiiKPWAl2XiROdd2AFLl7oPSUwUYSovr+U1srPdmTJ+xd0rcg8qkt6923f8Xoq+YYP86tRRBwJG7uB/UrW8XApYOuTliZXkk+MeQuTevr0s2tq1S8Q9MdGVg1/PBBO5jwQ2WWs3W2tLgH8BUyodYwHXfDftgVpUS1YU5ajjNdmZnw8tWljas98nzTAxUaLXWi/E8cpx9xH3yEjpexeqLeMt7tnZIu6RkZCYyIIFUok3Pt7r+ACeO/iP3B98EAYM8OS2//STvA4cSNXSAw6dOklU74eICLGhnMj9aFgyEJy4JwPejbZyXdu8uRu43BiTC8wBbvZ3ImPMdGPMEmPMkl0NUQNTUZo4M2dKg+aw4eWH79oFCQkGk9HPJ3KvU32Zigop9+sSd0f/HKuCmJi6ibsTuXfpQoWJZOFCGDu20vEB8tyhauReXCzdlqyFhQtl29KlMpE6ZAhVV6c6xMXB3r0BZ2gTEhqnuBs/2yp/g6nAbGttCjAZeNUYU+Xc1tpZ1trh1trhCU4Ve0VRguaxxyTF++uvw3RCxw9v3dol7sDw4VVsGajlpOrOnVLUyytyj4z0rICtk7gnJnrEPTmZtWvFjh83rtLxsbGi2l61X2Jj5dKVI/eXX5abmDGweLFsW7pUngZiYghsy8TFyfmLivwOuVMnuZHk5DQucc8FUr3ep1DVdrkGeBvAWvsdEA10QlGUsFFaKlaBtXDllXVYqu+NKw0SRNQ6dwaGDRMRc4W1dRJ3pxqjq/Z5QYHkikc4ylMXcR86FLslm/JcyXGfP182V4nc/dSXgart9srLpW/siBFw4om+4j5smOugvDzxfKKjfa8RFyeve/f6HXKnTtJ0qqKicYn7D0BvY0y6MaYlMmH6UaVjtgKnAhhjMhBxV99FUcJIdrYI0A03SLB6++1hOqlrstMduQ8eLPtWrwbqaMs44u6a4Swo8LJkwMcyadfOk+FYLbt3S/g/cCC3Zc1g1PpXKOuayoIFMtZevSodH0Dck5NxV5AE+OADabf6u9/BqFHSbGnLFrnPucXdXxokBCXuTtmBoyXuUTUdYK0tM8bMAD4DIoEXrbWrjTH3AEustR8BtwPPGWN+jVg206w92mVyFKV5s3GjvF52mQS7n3xSxxM6fvg55wBe4u6E6q7Zz7g4aNmy2pLlgXHa63lF7j7iHhvrfgRx9HH3bs8NxS+7d0v4n57O8oq+LGUoz+ftZP5yidpNZSPZq8yBN927w9y5nvfz5skNxvXnoKQEXnxRfveJ3Gsp7g6NRtwBrLVzkIlS7213ef2+Bqj8MKQoShhxxL1XL/l59VVJ0XPqV4XMzp1ygu7dKS6WwDYhAdcKI9z2Rw1tQqsnJ0cyYlzNRAsKoHdvr/0xMe5URid9cevWIMW9e3fykQP/7/OT2XMIZszwc3yAyD0tTbS6pERuXk4ue2SkRO4Azz0n33/oni/hu9Yy1pNOqnoNZxIhgFfmiHvLllXnYusLXaGqKE2B2bPZ9F0+sbEifE77Tq/WoKHjXrWU5i5F3rkznjxCr6yUyv500OTkyGBd4bS7royDl+fucofcwwqII+5paeTTmZEsZs8hucNV8duhWnG31uMcZWV5FhelpIgI79gBfdOKiZlyKpxwghzsT52DjNzT073mG+oZFXdFaezMmgVXX83Gedvo1Ut00hH3nJzqP1otXjnujrgnJAAtWoggeuVth1poy01OjjsktzaA515J3J11VQFxiXtZcncK6MQkPuWKKfuIi4OhQ/0cX2klrIPTgW/LFhmbt7iDJ3of1sGV8D57Ntx/v0x6VCZIcT9algyouCtK4+arr+CmmwDYuLuD29IIi7h7rU71EXcQa6ZS5B6UuJeWinnt4ETuiLaWlgYW97g48byDFffC4rZYIuhMPs+9EMnKlWJ7VKGayB3kHrdjh2RLeouvW9wPL5BG21ddJbOtzl3BG8eWCSDuzt9VxV1RFFHCiy6C3r0pvfk2tpQm06t7KeApjFVncY+Ph9hYdyaM2+vu0KGKuO/eLRZ9tXz4IZxyCvz4o5jZ27f7TKaCx9IHRNyPHJHvighusLaMM+bE1gdo1THGt1iYNwHEPSVFLJItW6r2jgU47TSIjLRMyH5FvlN1REfLTwBxd/6uKu6KosjM4q5d8JvfsKXPRMqJoncbMdnbthVd9k7lq5G5c2HtWs/75cuhf3+AqpG7H3GHICZVnQF9/72npm4lca+SLQM+1ky1kXtpqSTDx8e78+47p7WpfkwBxL1FC0mHDCTuw4bBnrk/cvyhb+Hkk6u/BnhWqfohNRVeegmuvrrm04QLFXdFaax4Kc6m6AEA9C5Z7d6dmhpi5H7VVXDHHfJ7WZkUTRkxAhBxb9HCa+Vox45VPHcIwppxwumlS/3muIMfWwaqiHvARGpHPL0i984v3l/9mFq3rtJH1cG5nvOndqwah9jvv5Bf6ijuANOmVap5U8+ouCtKY8VL3DceFHXtVbDIvTskca+okNTHBQtkJdTq1WIyDx8OiCZ36uSVIx4gcq+VuLsi9yp1ZaCKuHfvLgG2d1VfH5wxedsyfeOqH5MxfouHgccG2rxZvmPr1pUO+PJLyMjwtNKrjhrE/Wij4q4ojZUtWyAqClJS2JgZQWzEQTpnfufeHZK479kjor5vH6xaBT/8INu9Inef3HJH3CsqgFqI+6pVstzTGSjBR+5Qje9eSdyjojyJKtVSjbjn5kob2So11ktKYP78mv12BxV3RVGCIitLLI3ISDZtgl7xhZgVy92eRWqqRMMBalX54l07YP58Kenbvr17rb57dapDx44i7K5iL507i7MRlLhHRIg3PmeOCJ5LwAsKRIydZthAQHEP6Lt7ifvOnTKuKitS/eGnMiTIk0JFhfw5qoj7Tz/BoUP+Fy35o317FXdFUYLAK/F640bolVoiCumaSXSyQ4KaVPUW92+/lch9+HC3MlYRd9eKUkdMIyNFSGsU9507YcwY+X3xYp+uGQUFcs/wEWPvCdXiYtL2S/9Wt7hXLmhTKXJ3KiXUSDWRO0jCThVxd2yx4yr3JgpAXFyYqrmFBxV3RWmsZGVBWpp7FWVaX1edgRUigCHlujsiOXCg5M6vXOm2ZJzdVWwZCD3XPT8fRo70zBymegrKVlnABL4LjJ55hvjThhETY8WWycoSr/ullzzHO2a8S9yrLVPgTQ3iDn7E3blrJlduXxGAGmq6H21U3BWlMVJUJFFwejp79oj923WAK0F85UqgluJ+3nly3tJS92TqkSNedWUcnGT0UFapHjok405M9FTaClbcDx6EH3/ElJeR1vWIRO6ZmSKUf/iDnBs8N5u4OLctExQBxN2rMkLVHPRt22R8Pj5SNcTFyT9UcXGQg6pfVNwVJUyENWBzfIn0dHdNl6TebaWuyfLlQC1sGWM8JQ/BZzIVqrdlIAhx914J5Ufcq9SVAV9xd5UYTut0SL6+c77t2+Hhhz3jiYvDRkSGbsv4SYWUQl7yD+c3ck9JCdLUp8YSBEcbFXdFCQM//CB66CSI1Bkvcfdp/tO3r0S0yILIhIQQIvdOnWDQILFMEhLcwutoaDDinp9fTb31SuK+goHYVI/nvmuXH3F3OkXv2+fuSp3WfrevuJ9yCvzjH7KCyrU69dAhqY9e18gdIM1mEUVZ1RWuubnBWzKg4q4ozZEffpD/p//1rzCd0GtVjTtyT0LExqs8Y9DpkI5BHREhyyQvv9xnMhUCeO6VbJmKimqadniJ+7LEnzGYFby+ZzIgC2Pz8yVl3IeoKLlLLV/urm3QPTqffftg79b9sv/ZZ8XuuPVWPljbl3Wth3pWp4ZB3AdFrGYAK4ncW6nB9bZtBK5p4AcVd0VpfjgC++67YTphVpaIXpcuvpF7UpJnWT8hiLu3Qf3ww/DII+5dfm0ZJ2fRK3J3Kt0GtGa8xH3tNvGpn31bbhIvvywZN5dc4udzsbGwyLM4K62FlFjIzqqQMffuDXfdRdFbH3HRj7/jNzvv8CxgCtaWqVTDxpuHOvyNLzlFSiY4lJfL31nFXVGObRyBXb7c01SjTrgyZTCGvDzR2bZtkci9pMQtuikpIUbuwI03wrnnutcnuevFVOlZH+oqVS9xd1ylBQtk/vfVV+GMMwKIcUyM3HyMgZgYupXLU0tOXoTxvZI+AAAgAElEQVTnhnTnnSzqO41SWjJ3z/HuB5uQInfwG7232ZVNPHt9xX3nThF4tWUU5Rhl+XK4+WZycqw72+K998JwXq8cd5+2nU747OrSkZoqdnUAx8GDl7h/8430C33iCTn3I49Anz5+VnqGWl9m504R0datycqSX1u0kJoqeXlS2sYvzqRqjx7QrRupxXJ33Jrf2qPeUVF8c+pfACgub8mrr8rmWon7wYOeCN7bZ3I6YoOnC0ookXsNZX+PNiruilIXnnoKnnqKnKwyRo+WGuBhsWa8xD0vz6v5j/OLy3cPKh3yyBG5A7iUMC9PguQ774TJk2XXu+/6SQqpFLk75VWqjdxd19iyRfz1886T6r/x8XD22QE+54j7gAHQuTOJ+zfSogXk7InxUe9v1iYwsM8R4uMq+Owz2RayuO/dKw3A//hHee+UZYiKksjdSXlyUpDUllGUYxBr4fPPqcCQuz2S1FS44AKpmbV5cx3Ou3ev/LhW2PiN3CuJe7XpkF4zpocPi57dcotYPcuWyRqhgQP9fK6SuLdsKcF8MOLuuErTp8uuSy6pptdrJXGP2LWT5GTIORjvPl9JCXz3HZxyRivOOjsCaz2Nu4PCEfePP5Z/HNdaAffM7IknylOK8w/nRO6h2DLR0TKgRrJKVcVdUWpLZiZkZ7OTRErLIujWDc48U3Z9800dzrtsmbz27Yu1lSJ3R+VDidy9vHBHmIcMgU8/leyeiy4K8LlKtgyI1gW8lkvcKyqk8Fd6ulTKffJJT6DsF0fc+/cX4z8/n9SkcnLKu7rFfckSWRs0fjxMmeL+OsHjiPtzz8mr8yUccf/5z+XVsWZyc0Woq+RuVoMxjap4mIq7otSWzz8HICdS7JPUVEnsaNEC1q2rw3k//FDC3FNOYe9ecVXckXurViI4rsgyOVk0JShxT0z0Sas8/ni4+OJqPtehg4T5zswrYos7k5l+r9O5M3l5Ymm75oOZMcN/T2k3jvC6Inf27CG1wyFySPWZJwAJsH/2M/kzBJ0p432NrVvl1XnU8c6lb9PGM6nq5LiH2s3aEfdvvpE1CQ0o9CruilJbPv8cunUjp5c0ckhNFeu2d2/fhkchYa3Mdp5+OsTE+Oa4OzjpkMiNpEuX4CN3v+cLRIcOPpUhQcR982awObnuhVZlZXD3ny1n7JxNaccu7kyZyo0vAhIbK3mSffq4xTy1xQ5ySaGik0fcMzIksI+Jgd/+tponDn84Twcg/fP27pWJVSdyT06WVbVO5L5tW2iWjIMj7o8+KnWEw7aqLXRU3BWlNpSVSSOH008np710SXIskoyMOoj78uUimq4yAT457g5e4g5BpEPWRdzBx5rp0UPskR1X/hZOPpncLWWMHw9/ucfwKZNYUjzAb8u6arnhBkmEb9XKLe7dSjdRSkvyo5IoL5eUyvHjPR+55x55IggaJ3Lv0gWuuEJ+z8kRcY+MlBnf0aNl9nf3bk/pgVCJi5Nc2E8+kfeVbK2jiYq7otSGJUtk4uz008lp2ZPWFNEhSiLcjAyx42tsJu2wcqXkCRYUSNRujDu1pKbIHYJYyJSfL5N9rieBVq2CbPfmFA/zmlR10j03byiDLVv48zW5LFsGM/8od6F52/u5I/fu3YO4BojXftll8rsTue+VCc+tJV1Yu1YeHk44Icjz+aN9e3nMmTrV80iRm+u7cveKK2Tm9rnn6ibumzd7ajSouCtKE2PuXBHhU08lpyKZVHIwG9YDIu4VFSE8kX/0EbzyitgFb70FY8e6Rc5v5J6cLCuPyssBj7gHLFzmCJhrQVRSUpC1sPzUl3GL+w5pSv3T9yWMHw83nrKOgaxg3sYUsrJkvNHRQX5/bxxxzxPvO+dQB3fTqJEja3E+h1atpEnJvfd6RNuJ3B3zfuBAOPVUeOgheTyprS0DYjGBiruiNDl++kn+B+7Uia0HO9CNre5Z1H795JCgrZmtW6V557p18uNVuTEvTxwFb8uYpCRPT1RE3A8dqiYDzytFMS+v0o2iOvzYMt27gzGWzRXdKes3gNUHuzOoy07Iz+dk5rFgTRzr14fgt1fGEffs+QDk5Lfihx8kbdPRy1ozcqQs83VEOzeXKnWDb73V0w+wNpG7s5Dp17+WV+dcDYCKu6LUhjVr3B16cgqiSTW5sF4i97595ZCQxL1/f4ngJ0wQ68DF9u1+/PFQFzJVEveg/HYQcWvZ0tNvFYnGkxNK2EwP1l/zD0poxaAFz8KTT3Iy8zhcHMF334Xgt1fGZZ90KM+ntTlMTo5cftiw0BNXAuKk2uTkUKVu8OTJMiMOtRP3444TX//SS8X70shdUZoQJSUyaXbccZSWwvbthtT4Q25xb9tWItygxT07W9rRTZwoXZK81NdvpF2duJeXwxtv+NYj8IpOQxL3mBiYNAnefts3HTJ+L5vpwQozCIBBm96DrVuZcH4CxlisrUPkbgx07owBUlvlk5kpc8yuviLhw5mFrhy5R0RIKk7LltCzZ+jnnTZNngjatfO7TuBoouKuKKGyaZOIaEaGu0Bjaop1izuEkDFjrUTuXr1GvQkmcve2kPnsM5mcHDECVq2SnHmXgB04IJoftLiDLC3NyxO/2kWPNjtE3Hd0JirK0u/AEti6lfh3n2PIEDHzay3u4MmYidnD3LmSM+/VETA8pKaKBXb4cNWE+WuvlT98lUpqQRIZKa9NQdyNMZOMMeuNMZuMMXcGOOYiY8waY8xqY8wb4R2mojQiXE0lOO44txWS2ruVRPOuCLdfP9F6r4DXP3v2iGHuEnfvRhgVFQEi98REiTBd4t61q7zNycEzi1tQIBOE55wjan7ZZe7J2ZDE/eyzZT7grbfcm3pEZJFHMt//2IKMDEPLGE8NgJNOktda2zLg8d07HHR31wu7uKekyBMT+F8N5cw31IXGLu7GmEhgJnAGcBww1RhzXKVjegO/B8Zaa/sDt9bDWBWlcbBmjdgHfft6xH1gvGRYuAQjI0OCQmdBZECcA7p1Y8kS8bTvuEMi7KlT5ZROxzo3kZHi67pWqUZFiWDn5CBpeG3bipfxy1/Cm2/y/Rub2Nd9UGg57g4xMXDWWfDOO+47T49ieST55htp7OTNRRfJfary9pBwxL1zCSALcoNOqwwWr/Z/odUxCIHGLu7ASGCTtXaztbYE+BcwpdIx1wEzrbV7AKy1gXq1KErTZ+1a8R3atHFrc+pIV3jtKubudByq0ZrxEvfFi8XtefhhicbffhsefDBAg4tAue5ZWZKvmJwMzzzD9z0uYfS4KO68M0DOfDBccokUH/vqKwB67P0REK2vLOKjR8v9rU566Yh7sjz2jBgRfBvToPEW95DqGIRAp06NPlsmGfCeh891bfOmD9DHGLPAGLPIGDMpXANUlEaHV6ZMdrYEaLGDXQngtRX37t3ZtEnKm3z4oejza69JFO9X2JKSfEpBusV982a3J1JWBtdfL7b+6697moiELO5nnCER/LvvQkUFPfI9XZPqFKEHwhH3NPGuw27JgG8mTH2Je8eOYrkFvZotvAQj7v7+06q8XCIK6A2cBEwFnjfGVC79jzFmujFmiTFmyS6nDKmiNCXKy8VMd6n3li0uy6BrV7FDXAraqZPYtjV2ZcrOltS8hAQ2bZIEjZ//HFas8Cza9MuQIXKTcRWmSk2F3FyL3ZzlXmn05JNSYPK228TmeeYZuXm0axfid27dWmrd/Oc/sH07nUtzadNSml3Up7gPHBpFXJwk7IQd78i9thOnNeGs8G0gayYYcc8FvP4SpAB5fo750Fpbaq3NAtYjYu+DtXaWtXa4tXZ4Qn39QRWlPsnKkkjMFblv2eLKDDEGevXyUfM+faR2VLU4mTLGkJkppwiKiRNlxvWLLwDRquJiQ0FRa0hPZ+9e+NOfJG37oYek4OLOnSGsTq3MWWfJk8LHH2OAHl2L6dgxhAVRoTB8OHTvTtKE3uzZA2PG1MM1nD9Ehw5SlqA+aALi/gPQ2xiTboxpCVwCfFTpmA+AkwGMMZ0Qm6Yu7QoUJWz89FMQE5vB4mTKZGRgrZe4gyx+qaW4l5cTmriPHCkh+P/+B3hSsjfSG3r0YNkycQRuuUU0zGmaEbIl4zB5srzOnAnA2ROPcPHF9eCFg9yJtmzxtH6qD1q2FDumviwZaPzibq0tA2YAnwFrgbettauNMfcYY1wV7vkMKDTGrAHmAb+x1jbcNLGieHHeeVIDPCzWp5e479olGTE+4p6V5c4q6dNHgl0nnc8vLnHftk3WRgW9bqZFC6lB/tlnYK3H4ycD0tPdXr/rAYPLL5dMnNosugREaIcPl9x54G+PtnZ0vunSo0cd/iBB0MDiHhXMQdbaOcCcStvu8vrdAre5fhSl0VBU5C47zoMP1tARKBhWrpRMlPbtyXatynen6fXuLcK+ZQv06uWuhbJpk7TtrEJJiSyW6daNzEzZFHTkDmLNfPABbNxIWs8+tIoqY22ZS9z/KXOgjnbFx0uHOW+rOWTOPFOqYSYkyPxCU+fFFz0LjuoDp4tTA2XM6ApVpVnjrOlJTIT77qtj74RVqyQ/0TXDV6UphVOTxGXNOOLutXDVl23bJJWlWzf3uEIWd4D//Y/ISOjbbjvrWg6GNm1Yu1YWUnnbJqed5ql7UyucHoJ1Wn7aiOjbN8Q/eIg0dltGUZoyjuf94otis/7+97U8UUWF5BW2bw9//ztA1brllcTd0Y2AvnulNMgWLUJ0CXr2FGvB5btnRG1krRF/Zu1aTzpm2Bg2TEz73lVyJRR/REdLelJjtmUUpaniCOv48XDuuVKGvVbMmgULF0rHIFem15YtUr7bqfJK585Sn9cl7m3bilgHFHdn+bvLlunRoxYuwc9+JmMqLKTfkRW8feQk8vPloSDs4h4RAfPm1SKX8himAVepauSuNF8KC9m4voKkJPGf+/eXVZoh9yxesQJuv10aOTgt2hBt9nEojAktY2azK6EsJYVNm2rpENx0k9QouPtuMvYvxhLBxx/LLqeufFjp06d+s1iaGyruihJmCgqgZ082fLXN7X07mSMh9TctLJTiW3Fx8OqrPia2Txqkgx9xX7/e1SWpoMDT1WjTJtY8/F/e6HUXNrq1ewFTyPTvD7/4BcycSYZdDcC//y27wh65K6Gj4q4oYeapp2DfPjZuj3FbxI64O9mMQXHVVeJx/PvfPit2quS4O/TuLTtKpOhVnz7ypFBYiPhCaWnwyCOsnXw74w/N4bJNf+H++yVdstZze3/5C0RH04cNRERY5s6VYmK1ulko4aUB68uouCvNj0OH4Kmn2EM8u0rj6dND8s67d5eV9EGLe1GRLLm/7TYYNcpnV2GhXKZKtcLevWXyNSsL8GSnbFhvxd4Bsm9/nIkbnyIqLoZx4+D//k+OqbW4JyXBHXcQHVFKerdySkpkGPW18FIJAY3cFSWMvPii+O2X3Q1AbyM2SWSk+NCrVwd5HscT95Ok7syFVoncHQ/I5f04bzcsK4L9++HPf+bOExewr3UX/vdVKz74wHOOOkXaf/4zrFhBxgDJkVBLppHQsaPU7Hc1Mz+aqLgrzYuyMqmZO3YsG0+4CoA++Qvcu487LoTIvZrk8yo57g6DB0vO5cKF7v1RUbBhqavtXXo6q/emMOHUFgwaJP/vf/KJRO91SrmOjIT+/d2TqPUymaqETseO4uGFPItfd1TclQZn4UIRIycarhMffywn+s1v2LCzPRGU02Ptf9y7jztOSuPu3x/EuRxx9xNSO7uqiHvr1lL35euvAY/3vWGtRG62exqbN/uesn9/+Otfw9MA2onYNXJvJDTgQiYVd6VB2b9f6p6sXw8LFtR8fI0884yssT/rLDZsgO6xu2m16Gt3vztnUnXduiDOtWmT/M8ZH09pqdjvl14q1QfuvFN2xVUpbA1MmABLl8LBg4ArHTJbWtHlx/Tg0CF3Vd6wc/LJ0l1v/Pj6Ob8SIiruyrHKrbdKoG1MiCmK/ti0CT7/HK67DiIj2bgR+nQvEc/TdfKQMma8ks8vuECq3n72mQjogw9WsyBq/HjxWF3WTJ8+sDG/PRXt4sgslLtBfWWypKfLvG2AftvK0aZTJ1n0VW31uPpBV6gqDcbcufDSS/CHP0j/5TqL+6xZ4j1fey3WyuKhMefEwCrg22+hf3969BBLPGhxHzeO8nJZ4X/llfDcc/L5ajnhBBnHN9/AxIn06QPF5S3JTR7lLhCmaYrHCCNGwL59DXJpjdyVBuPdd2W1/l13iUcclFXiUFTkm/Zy+LBkyZxzDnTtytat0n2o/5h2sqLyu+8A8cD79g1C3I8ckdovvXqxZYssAh0/PghhB1kOO2yY23d3Z8zEi7gb4+6Epyj1hoq7cvRxCfPcuWJxtGwp4r5hg7sUes08/LA0dbjqKpg/XzozFxbCjBmAtJcDGDLUyHFejwXHHRdEOmRWlmQ59OrlvhE4lk5QTJgA338Phw/Tp7d0pdwQPZDMTKk306pVCOdSlFqg4q4cXayFCy8ka8BZZGbCaRnbABH30lJPanmNrFghFffeeANOPBF27JCcwpNOAmD5comQBw5EUnHWrXPVAJBtW7bUkDHjlQbp1Z8jeMaPl1WqixfTNWoXbTnIhvJeVTJlFKW+UHFXji4vvQRz5vDF0N8AcNpjZ8GuXe687KB99w0bJOxfvFiSxFet8tQbRyL33r1dPSX69hWPZscOQHpLg3vBqH8qiXtSUoDMmECMGyce0Jw5mC1Z9GEDGw52dVd/VJT6RsVdOXps3SrpMRMmMLf3DSR1PEK/I8vgp588beKCEfeKCinO1acPHH+8JIlXari+fLnXwlLnzuEy9Z3tjnXjl02bpJZvx46sWROiJQNyJzjjDHj9dcjMpC/r+Sm7Azt3auSuHB1U3JWjg7VwzTVQUUHF8y/yxZeG004DA7B8Oe3bS12uoCZVt22TCVRnprIS+/eLveNE6O4CL66WSMnJkn5co7j36kWFNaxdWwtxB0mvycuDF1+kDxvYUSDFXlTclaOBirtSfxQWSpoJwD//KbmPDz3EioM9KCiA085sJbOLLn8kIyPIyN0pkB5A3B27xR25JyeLP+8Sd2NE+Jcvr+YaLnHPyZEU5VqJ+1lnSfT/xRf0idnu3qzirhwNVNyVavn66xoiXH+sXAlTp0pnol694PHH4Y47pInn9dfz2Wdy2KmnAoMGVRF317xnYGoQd3emjBO5R0RI9O71WDB4sAzTX3aO3bef2ZvHk991cO0yZRyio+Hii2WoqYfdm1XclaOBirsSkL174eyzpQlR0Bw4AGPHylr9m2+WHPNbb5VFPS+8gMXw8stSfiUpCRH3tWuhpISMDPl4Xl4N19iwQSLxpCS/u5cvF9vFZ3ffvj6dqocMkVT2Kl2SfvyRef1ncLV9kWsWXedOmayVuINYM0DvvvK/Wny8/ChKfaMrVJWAPPusiO2qVSF8aPVq+dD777Nr7DmUHqmg6/x3MEldoVs3Fi4QLX/hBdfxAwdKDuT69fTrNxCQ/cnJ1Vxj40ZJhQlQaWvZMhFvr6ZJMqn61lvi1bdu7TOp6hbuVatgzBieiPgQYyyfLOrEmnx5AHFKhITMCSfA5MnETZlA54VaFkA5emjkrviluBgee0wC7vx82LUryA+uXCmvgwYxahQkp0aQMONi7pwzHmulQkBsrNutkMgdYMUKyUmnBi8cJNx2WTIrV0oGZH6+7CorE42uUoK9b1/xe1wpjv36yeIpH8vp/vvJiurNR0d+xm9+Yxg0SCZmax21g9xh/vMfmDaNyy6D88+vw7kUJQRU3BW/vPIK7NwpVjmE0OBi5Upo25b9HdLIypI5xfHj4YEH4JZb4O23pQpk27au4/v2lZZBK1bQubN0Nlq8uJrzOyudXOL++ecwZ47UCrMW/vEPuTGNG1fpc5UyZlq2lFK77htJdjb861/MzHiSiAjDLbfIHLBxLXANB488ItUkFeVooOKuVKG8XKoeDh/uXs0fmrgPGEBmlvyndfXV8N57cP310ta0uBimT/c6vkULCY1dk6qjRtUg7llZMkCXWG/dKps/+kgyLf/4R7jsMikx44Mz+VppUtUduT/2GIdoywsbJ3DBBWILjR4tBcN+//sgv7uiNCLUc1eq8P774l68846IXPv2QYq7tSLu557r0+fCGJg5U9Ye7dnjlcXiMGgQfPEFIOL+9tuymLRLF69jjhyRE1XKlMnOliybrl1l8euQIWL9+PjtII8Kqak+k6pDh8Ls2ZC7ai8pzz3HvBP/wt6vIrj2Ws/HTjstiO+tKI0QjdwVH6wVC6V3bzj3XBHJ/v2DnFTduVNy2wcMqNLEKDJSRPedd/x8btAgSZEpKHD3ofaJ3tevl0F06wZPPinbevcGJHJPTxcb6brr5MbUpk2A8fXvL000XDjX+v7pJXDoEIt7XkpkJIwZE8R3VZRGjoq74sO8ebBkiXjtkZGyrX9/idxrzD93JlMHSvXDLl2k+m2NDBsmr599xvHHS0mW77937fv2W1Hb/ftF0P/3P2mA0KEDIOLerZs8Ycya5aftnTeTJ0sqjit6HzxYXKHFC8shLo7F2V0YMMBrPkBRmjAq7oqH4mIeuDGbxFZ7uPJP3eHppwGZUNy9WwLzavESd68mRjUzYYJ4K/ffT+tWFQwa5IrcKyrgootEzBctkuYXc+bAa68BsnK0oCCE9ELHiH//fUDWGA0ZAoszO1IxbATf/2Dc0byiNHVU3BXhs8/Y2W8C/1vfnZtiXiG6ogj+/W9AIncIwppZtQoSEyEhgU2bQliJGREhs5arVsF//sOoUfDDD1CxYpWY73/4g5RSNEaKcf3sZ4A0ugbJsAmK1FTpjOMSd4BRw8pYcrAfa3ucyb59qLgrzYagxN0YM8kYs94Ys8kYEzCZyxhzgTHGGmOGh2+ISr3z008waRJryiUDZfSbv4ILLxRvpLzcLe41Tqq6MmUOH5baXkFH7iDlCtLS4K9/ZdRIy/79sO7Nn2TfKaf4/Uh2tryGtDDo3HPle+XmAjCqcxaHiOGl/MnyXsVdaSbUKO7GmEhgJnAGcBww1RhTZVmHMSYWuAWoLpFNaYy88w5ERrL2FrFhMjKQPMADB2DdOhITxeKuVtzLy+WAgQPdDTdCEveoKPjd72DxYka5/hNa/Nke8dlTU/1+xEmDDEnczztPXj/4AIBR5dLE+oWvehIb66kOrChNnWAi95HAJmvtZmttCfAvYIqf4+4F/gEUh3F8ytHggw9gwgTWbo0hNta19N8JYRctci/kqba5xfz5srTf5bdDLQpkTZsGiYn0eeevxMZafloTHTBqBxH3yMiAJWb807ev3L3eew+AXlmf08HsYe++CEaM8EwiK0pTJxhxTwZyvN7nura5McYMBVKttZ+EcWzK0WDDBskgOecc1q2TyNUYJGKOj3fnJI4bJ1k0hYV+zrFjB1x6qeQknneedxOj0IiOhptuImLOJwxMzGd5aYardKR/srPlRhQV6mqNK6+Er76CuXMxS35gZII8aqglozQnghH3ystBANxJccaYCOBRoMbagcaY6caYJcaYJbuCLlaihA1rq9a4/fBDeZ0yhbVrvWyJiAgp3bhoESCJJuXlUibFh9JSyWjZs0cmKuPiyMwUG6dW1Q9/+UuIjmZQ9sesYBB2wknuXQsWSGLNxInyfuvWECZTvbn1VrnzTJ8OGzYwakARIF9XUZoLwYh7LuBteqYA3kVZY4EBwFfGmC3AaOAjf5Oq1tpZ1trh1trhCZXaoinBU1gohbIOHgzxg7ffLv6110IePvgAjj+e/XHd2LatUhPo0aPdVR6HDRP7w7kXAJKqePXVkov+3HPual0hZcpUJiEBrrySQaVL2Us8uUfkv5M//EGeHhYtknoyK1d6ctxDJjpa0jyzsgA4/+Ioxo6VG4eiNBeCEfcfgN7GmHRjTEvgEuAjZ6e1dp+1tpO1Ns1amwYsAn5urV1SLyM+xnn6aUn7TkyUMrTO5GWNbN0qxV127oSTTpJJ1I8+gu++c1syUEncR40SAV+yhIgImDIFPvvM1VzJWik88/rr8Le/SUEXFyHluPvj1lsZhBj8K1bIE8PTT0v1x/XrxRd/7TVJhax1Cd3TT4dLLoGoKAZe2I/587XOutK8qFHcrbVlwAzgM2At8La1drUx5h5jzM/re4CKLx98INb2o4+KwzJ7dpAfvP9+eV2wQFIOL7pI1Brg/PPd7e18xN3xKVy++5QpsnDoiy+AV1+FZ56B3/6WBSfeyfTpsiK1fXsJiOsk7hkZDPjo74CI+48/SuOQyy+XoZ92mqxGLSurpS3j8MIL8t1U1ZXmiLW2QX6GDRtmldA4fNja6Ghrb71V3k+caG23btaWl9fwwZwca1u2tHb6dGuttd/896C9eFyOPfLFt7LPWnvnndZGRVlbUlLps336WDtmjLUVFba42NrYWGuvvdZae+aZ1qan2y/mVliwtm1bay+5RMZ2xx3WbtlS9++blibn/NvfrAVrd+6U7bNny3uwds6cul9HUZoSwBIbhMZqVcgmxIIFYok4lQqvukrckK+/hpNPruaDf/+72Cuu2rV//Htbvpnflp9lp3C1K9Nw7VpJkGnRotJnb79d6vW++SatLr2UyZPh448sFfu+JOL66/j4E0N0tNT9atcuvN/Xaa+any92fufOsv3cc2VIR45oZyNFCYSWH2hCzJ0raX/jx8v7c86RrkYvv1zNh1atkq4T114LaWksWyYlWiIjpbFFRYUctnZtJUvG4ZprpLD7HXfA/v2cfTbszDcsPdIfzj6befOkk1y4hR1E3Nevl5uad+nddu2kCQiouCtKIFTcmwozZzL3idWMjl9H7HuzASlte/HF8O67ATJnrIVf/UrU8N57AamY26YNPPGE9K34+GMoKYHMzADiHhkpxdh37IC772bSJIgwFfyn5XkU9h/P8uU1PDXUgUGDZDL1yJGqdcrNwTUAABGhSURBVNXvvVe+Q2xs/VxbUZo8wXg39fGjnnsI5OXZwtbJ1lBu7459SMzmTz+11lr79dfy9p13/Hzu3Xdl51NPWWut3bXL2latrP3lL60tLRVPe9Aga88/Xw577bVqxnDDDXLQe+/ZE1p8b4fFb7LvvSeb5s8P/1e21tp16+T8LVpYe/Bg/VxDUZoaBOm5q7g3MsrLra2oqLRx+nT7buRFIqTzSqzt1cvajAxrS0psSYlMZt54Y6XP7NplbXKyqHdpqbXW2nvukX/xVavkkJkz5X3HjtbefLO1xcXVDOzwYWtHjrS2RQv7V35vwdoLLrC2TRtrjxwJ17f3paxMJpAnTKif8ytKU0TFvQlSWmptaqq1jz7qtXHNGltiWtpTU9fZ2FhXNssHH8g/3ZNPWmutnTRJtN5NRYVks7Rsae3SpdZayV5p08bac87xHFZebu3334cgztu2Wduli11mhrizVSZOrMs3rplnnrH2yy/r9xqK0pRQcW+CrFgh/yI9e7qi9x9+sOUDB9tLo96yYO2sWa4DKyqsPfVUazt0sHb3bvvAA/K57dtd+x9+WDY88YT78LPOkgg/O7uOg1y50la89rpNSZFL/P3vdTyfoighEay464RqGKmokFIrpaUhfrC4GGbMYOkrUlM3MxMWnP8IjBzJ7zKn80bZRfztb9IjFJDKXg8/LO2RHn7YPaH51VfItv/7P1lxNGMGID03PvkE/vKXMGSXDBiAuUxSIqH+JlMVRakjwdwB6uOnuUXuxcViqTh2xW9/G8KH33/fWrAzeNK2bVFs20Ycstcyyy666GFrTIWdPt2PD2+ttRdfbG3btrY0L9+2a+dao/TkkzKAZcustdZ+/LG1rVtbO3So23oPC6tXi08fznMqilIzBBm5Gzn26DN8+HC7ZEnzKT8zb56UHr/2Wom8Fy2SkrRB1Ue76ir4+GNOiPqeyF3b6dlqG/+OvID0XlEUFEgOut888nXrpAfebbdx9roHWb8eNrQdKhUdly7l1VelrtfQoVLN0VkEpChK08UYs9RaW2O3O7Vl6srevXDppcy9dyGRkZZHHpG08OJiySmvkdJS+Ogjys6cwrKDvRh2fjpXvT6RA0VRrFgBjz9ezQKhfv2k4MpTT3HywAI2boRty/LhF7+gvFwq244eLTceFXZFObZQca8rd98Nb77J3HmRjC5fQOzbL5CRIZb3U08FUZb3q69g717WjbiCw4dh2JQUJpzbgb594ec/h/PPD+L6rVtz8rMXA/BF1CS49FKWLBH7fcYMiImp+9dUFKVpoeJeF1atgqeeYs/Vt7EkYiSnddsoy/R37eJ3v5P+Fc8/X8M53n8f2rRhaetxAAwbJq7KkiVSldf4a5XiTXo6LFjA4JhMUsjhnc43QXw8n34qnz399LB8U0VRmhgq7rXFWrj5Zmjfnq9OupuKCsNp950kTaXvuovRo8USee21as5RUSE1fM84g6UrW9K2rbT4BIm2W7YMciwZGUQsWsgl/VfxWf4Qdu+WuuvDh0vNd0VRjj1U3GvLm2+KpXLffXzxfSwxMTDqknS46SYpNr58OaecAsuXQ1FRgHO89hps3w7nnsvSpTLxWesGzUlJTH3lDErLInj+eSlTPmlSLc+lKEqTR8W9Jr75BqZOlcad06bBvn1QUCAFuUaOhOnTmTtXWrS1aIF44HFx8Je/MGaMNJTwmxT0n/9IxcXx4yk/9wKWLRNLpi4MHQp9+kg+e0UF/OxndTufoihNl2NC3BctkpTAadNkfY9T5rZGioulFdv//iei/vrr0qLu+uslS+b558ndHsn69XDqqa7PxMfLxT7+mNE9pQn4d99VOu9338EFF8DgwZT++2Ou/mUrioo8pXxrizFyHyoqko5Io0bV7XyKojRhgkmGr4+fo7WIqaLC2uHDpa5KUpKs7/n3v4P88FNPyQec4iZz5siKILD2j3+01lr7xhvy1lXCRVi1SjY+/LDt3dvaKVO89uXlWdu1q7U9e9r9WQV24kQ59L77AixUChGnkuL559f9XIqiND7Q2jLCd9/Jt5w5U1ZT9uhh7ahRQQjpkSOy5HTsWN+DFy2y9rbbpEqitfamm6yNifGzUnPUKGuPO85eeWWF7dzZdYojR+R8bdrYHfPW2GHDrI2MtPb558P5jaW0jM/NRlGUZoOKu4upU61t187aAwfk/dNPy7f+6qsaPjhrlvWumz57trWjR0thRG8GD7b2tNMCf/6Z3222YG1mpnXX3N329Ae2Z095CPjkk7p+Q0VRjiWCFfdm7bnn5Umu+DXXeBbyTJsmqzUfeKCaDx48KK1+RoyAiROxFv76V/HuJ06UxUEgNvzKlTBunJ9zXHwxtG7NmPXSA2/h1yWyZPXMM3ll3xQyM+GLL+DMM8P5jRVFUYSmLe4HDsCPP8KcOX7zDZ99Vtq03XSTZ1vr1nDLLfDf/0ppFr/cey/k5MBjj4ExLFoEGzfCL34hr5MnS2u6RYtkcnbsWD/naNcOrr6aAR/9jZg25Xz3aibs2gW//jWLF0OvXjBmTFj+CoqiKFVouuK+YgUkJWGHDeOlM99h2am3+dTaLV2XyfMPFHJGqy/oeeeF8MYb7n2/+IVklrz9tp/zrloFjzwi4f4JJwDSgLp1a3j0UXjlFckhf+YZadwcGVlNVso99xAZ346RLZax8DsDAwZgTz6FxYs1k0VRlHomGO+mPn7q7Llfcom1sbH263u+cpfZvbTXIpu3KNvae++177eUtnQfjr3f2m7d5IBHHnF//MQTrR04sNI59+2TidCOHa0tKLDWyrxpXJy1l18uh1RUiMceH2/tsGHWHn98DeN8/nl7H/8nzTQeft1u3Wq9+2goiqKEBM16QjUrS9JMbr/dXnaZte3bW/vb0V/ZaIrsCBbbEqLsGQk/2KTEMsliKSvzdIGePdtaa+3jj8vbdetc59y6VdQ+MtKn2/Rbb8lxn3/uufyyZdYaI9tvuaWGsZaX258GXmHB2hefPWLfeUc+t3hx7b++oijHLs1b3G+5xdqoKFuwYptt1craGTOsteXl9u2L3rFg7TUX7bfGWPunP3l9prhYQu7ISGv/+1+bkyPf/q9/tdbu3i3NpNu1s/Z///O51IQJ1qakyP3Bm6uvls+/9VbNw60oKLTJXUrt+edbe8cd0tq02mbUiqIoAWi+4l5QICuSrrzSPvqofIMVKzy7L79cthkjTaF9OHDA2iFDrI2NtXbFCjtmjHQosjffbG1EhHSL9uLLL+Vcjz9edRg7d0q6u5NiWRPXXSeXHTVKfhRFUWpD8xX32bOtBVuxfIXNyJDcc2/27pWFSuedF+DzOTmyVDU11T58W64FazdF9Lb2xhuttdbu2SNRdUWFtePGyaGu9Up14sMPrXtuoEYrR1EUJQDBinvTy5a56ipYv56nvx3I2rUwfbrv7vbtYfVqKdrol5QU6RZdUsIFj58IwButpsE991BcLF3revWC3/wG5s+XWjTR0XUf9qmnQqtW8vvIkXU/n6IoSnU0PXEH3ljSh5tvhrPPhiuuqLo/OrqGWuhDh8KaNXSbOpaT+ZJXYm7CdujI++/Lwqc2beDhh+U+cO214Rlz27ZScww0DVJRlPonKpiDjDGTgMeBSOB5a+39lfbfBlwLlAG7gF9Ya7PDPFYAPv1Ugvfx4+GttyAqqG/ghw4d4NVXuWrYHqb9uj0LF0oZ9h49YM0aaXbRtasn2g4Hrt4e9OwZvnMqiqL4w4iFU80BxkQCG4DTgVzgB2CqtXaN1zEnA4uttUXGmBuAk6y1F1d33uHDh9slfgudV09mJtx5J7zwQjWNo0Pg4EHo0kWsknnz4O9/l/MriqI0RowxS621w2s6LhhbZiSwyVq72VpbAvwLmOJ9gLV2nrXWWf+/CEgJdcDB0rOn1IsJh7CD1Jw5/3wR9qgoqT2jKIrS1AlG3JOBHK/3ua5tgbgG+G9dBnW0ueoqeZ0yRaJ4RVGUpk4wjrXxs82vl2OMuRwYDkwIsH86MB2gW7duQQ6x/jnpJMmKufTShh6JoihKeAhG3HOBVK/3KUBe5YOMMacBfwAmWGuP+DuRtXYWMAvEcw95tPVERISU9FUURWkuBGPL/AD0NsakG2NaApcAH3kfYIwZCvwT+Lm1Nj/8w1QURVFCoUZxt9aWATOAz4C1wNvW2tXGmHuMMT93HfYgEAO8Y4xZZoz5KMDpFEVRlKNAUFni1to5wJxK2+7y+v20MI9LURRFqQNNcoWqoiiKUj0q7oqiKM0QFXdFUZRmiIq7oihKM0TFXVEUpRlSY+GweruwMbuA2laO7AQUhHE49YmONfw0lXFC0xlrUxknNJ2x1tc4u1trE2o6qMHEvS4YY5YEUxWtMaBjDT9NZZzQdMbaVMYJTWesDT1OtWUURVGaISruiqIozZCmKu6zGnoAIaBjDT9NZZzQdMbaVMYJTWesDTrOJum5K4qiKNXTVCN3RVEUpRqanLgbYyYZY9YbYzYZYxpNt1NjTKoxZp4xZq0xZrUx5leu7R2MMZ8bYza6XuMbeqwOxphIY8xPxphPXO/TjTGLXWN9y1XiucExxsQZY941xqxz/X3HNMa/qzHm165/+1XGmDeNMdGN5W9qjHnRGJNvjFnltc3v39AIT7j+H1thjDm+gcf5oOvffoUx5n1jTJzXvt+7xrneGPOzozXOQGP12neHMcYaYzq53h/1v2mTEndXs+6ZwBnAccBUY8xxDTsqN//f3v2FWFVFcRz/LDKEjCgLyzIYDalIKqUHrR6iP6QiRtCDISQU9BJUEFSDEPQYRNlD2UOREFKQSYlQEdazkZEplWUoplgZlEG9GK0e9r54nWbQoOacGfYXDvectffAj9+cvebcte/c9Scey8yrsRQPVW1PYkdmLsSOet0XHlG+xnnAM3i+av1FaZnYB17A+5l5Fa5TNPfK14i4DA/jhsxchLOU3gd98XQTlo+JTeThCiysx4PYOEkaGV/nh1iUmdfiG4xCXV9rcE39mZdqjpgsNvmnVhFxOe7AoaHw5HuamVPmwDJ8MHQ9itGudU2g9d36C96HuTU2F/u61la1zFMW9K3YrrRT/BkzxvO6Q53n4YC6PzQU75WvTvYanq18lfZ23NknTzGCvafzUGm8c+9487rQOWbsbmyu56esf6XnxLIuPa2xLcpDyEFc1JWnU+rJ3b9v1t0JETGCxdiJizPzKNTXOd0pO4UNeBx/1esL8WuW5iz0x9sFOIbXagnplYiYpWe+ZuYRPKs8rR3FcezST08HTORhn9fZ/XivnvdOZ21gdCQzd48ZmnStUy25n3Gz7q6IiHPxNh7NzN+61jMeEbEKP2XmruHwOFP74O0MLMHGzFyM3/WrtAVqvfouzMelmKW8FR9LHzw9Hb28FyJivVL+3DwIjTOtM50RcY7SR/qp8YbHif2vWqdacj+jZt1dERFnK4l9c2ZureEfI2JuHZ+LPvSYvQmrI+Ig3lRKMxtwfkQMunP1xdvDOJyZO+v1FiXZ983X23EgM49l5glsxY366emAiTzs3TqLiHVYhbVZ6xr6p/MK5Y/77rq25uGziLhEB1qnWnI/bbPuroiIwKv4KjOfGxrahnX1fJ1Si++UzBzNzHmZOaJ4+FFmrsXHuKdO64vWH/B9RFxZQ7fhS/3z9RCWRsQ59V4Y6Oydp0NM5OE23Fc/4bEUxwflmy6IiOV4Aqsz84+hoW1YExEzI2K+sln5SRcaITP3ZOaczBypa+swltR7ePI9nczNh/9oA2OlsmP+HdZ3rWdI183K26wv8Hk9Viq17B34tr7O7lrrGN23YHs9X6Asjv14CzO71ld1XY9Pq7fv4II++oqn8TX24nXM7IuneEPZCzihJJ0HJvJQKSG8WNfYHuUTQF3q3K/Uqwfr6uWh+eurzn1Y0bWnY8YPOrmhOumetv9QbTQajWnIVCvLNBqNRuMMaMm90Wg0piEtuTcajcY0pCX3RqPRmIa05N5oNBrTkJbcG41GYxrSknuj0WhMQ1pybzQajWnI3/9NqZs4jeSdAAAAAElFTkSuQmCC",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x120f56d30>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 画出实际结果和预测的结果\n",
    "plt.plot(pred_test, 'r', label='prediction')\n",
    "plt.plot(dataset, 'b', label='real')\n",
    "plt.legend(loc='best')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这里蓝色的是真实的数据集，红色的是预测的结果，我们能够看到，使用 lstm 能够得到比较相近的结果，预测的趋势也与真实的数据集是相同的，因为其能够记忆之前的信息，而单纯的使用线性回归并不能得到较好的结果，从这个例子也说明了 RNN 对于序列有着非常好的性能。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**小练习：试试改变隐藏状态输出的特征数，看看有没有什么改变，同时试试使用简单的线性回归模型，看看会得到什么样的结果**"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
